home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / programming / other / sounddt41src / snddtprefs / main.c next >
C/C++ Source or Header  |  1999-04-19  |  27KB  |  1,183 lines

  1.  
  2. /*
  3.  *  SoundDT41 prefsed -- A free release of the sounddt41 prefsed source code
  4.  *  Copyright (C) 1998/99  Stephan Rupprecht
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  */
  21.  
  22. #include <dos/dosextens.h>
  23. #include <dos/var.h>
  24. #include <dos/dostags.h>
  25. #include <dos/rdargs.h>
  26. #include <devices/ahi.h>
  27. #include <libraries/gtlayout.h>
  28. #include <gadgets/colorwheel.h>
  29. #include <gadgets/gradientslider.h>
  30.  
  31. #include <inline/gtlayout.h>
  32. #include <inline/intuition.h>
  33. #include <inline/graphics.h>
  34. #include <inline/dos.h>
  35. #include <inline/exec.h>
  36. #include <inline/ahi.h>
  37.  
  38. #define REG(reg,arg)    arg __asm(#reg)
  39.  
  40. #define TEMPLATE    "VOLUME/N/K,BUFFERSIZE/N/K,AHI/S,AHIMODEID/K,FAM=FORCEAHIMODE/S,AMF=AHIMIXFREQ/N/K,AIFF16/S,C=COMPRESS/S," \
  41.                 "W=WIDTH/N/K,H=HEIGHT/N/K,BG=BACKGROUNDCOLOR/K,WF=WAVEFORMCOLOR/K,CP=CONTROLPANEL/T,NOGTSLIDER/S"
  42.  
  43. enum {
  44.     ID_NONE,
  45.     ID_SAVE,
  46.     ID_USE,
  47.     ID_CANCEL,
  48.     ID_PAGEDGROUP,
  49.     ID_AHIREQ,
  50.     ID_BGCOLORSLIDER,
  51.     ID_WFCOLORSLIDER,
  52.     ID_FRAME,
  53.     ID_AHI,
  54.     ID_FORCEMODE,
  55.     ID_BUFFERSIZE,
  56.     ID_CONTROLPANEL,
  57.     ID_NOGTSLIDER
  58. };
  59.  
  60. /****************************************************************************/
  61.  
  62. struct Library        *DOSBase,
  63.                 *SysBase,
  64.                 *GTLayoutBase,
  65.                 *AHIBase,
  66.                 *IntuitionBase,
  67.                 *GfxBase;
  68.             
  69. struct MsgPort    *AHImp;
  70. struct AHIRequest    *ahir;
  71.  
  72. struct LayoutHandle    *layouthandle;
  73. struct Window        *Wnd;
  74. struct Screen            *screen;
  75. ULONG                BgPen, WfPen;
  76.  
  77. struct {
  78.     BOOL    AHI;
  79.     BOOL    ForceAHIMode;
  80.     ULONG    AHIModeID;
  81.     ULONG    AHIMixFreq;
  82.     UWORD    Width;
  83.     UWORD    Height;
  84.     ULONG    BgColor;
  85.     ULONG    WfColor;
  86.     BOOL    AIFF16;
  87.     BOOL    Compress;
  88.     ULONG    BufferSize;
  89.     ULONG    Volume;
  90.     BOOL    NoGTSlider;
  91.     BOOL    ControlPanel;
  92. } prefs;
  93.  
  94. TEXT AHIReqLabel[ 128 ];
  95.             
  96. /****************************************************************************/
  97.  
  98. BOOL openlibs( void );
  99. void closelibs( void );
  100. BOOL opengui( void );
  101. void closegui( void );
  102. void loadprefs( STRPTR path );
  103. void saveprefs( STRPTR path );
  104. void handleevents( void );
  105. LONG Hex2Long( STRPTR s );
  106. void sprintf( REG(a3,STRPTR PutChData), REG(a0, STRPTR FormatStr), STRPTR data, ... );
  107. BOOL AHIModeRequest( void );
  108. void Restore( void ), Quit( void ), About( void ), Defaults( void ), LastSaved( void ), init_prefs( void );
  109. void start( void );
  110. ULONG GetAHIDefaultFreq( void );
  111. void errorreport( STRPTR header, LONG error );
  112.  
  113. /****************************************************************************/
  114.  
  115. void dummy( void )
  116. {
  117.     start();
  118. }
  119.  
  120. /****************************************************************************/
  121.  
  122. UBYTE    VerStr[] = "$VER: SoundDT41 prefs 41.0 (27.01.99) © 1999 by Stephan Rupprecht";
  123.  
  124. void start( void )
  125. {
  126.     struct Process    *pr;
  127.     struct Message    *wbmsg = NULL;
  128.  
  129.     SysBase = (*(struct Library **)4L);
  130.     
  131.     pr = (struct Process *) FindTask( NULL );
  132.     
  133.     if( ! pr->pr_CLI )
  134.     {
  135.         WaitPort( &pr->pr_MsgPort );
  136.         wbmsg = GetMsg( &pr->pr_MsgPort );
  137.     }
  138.     
  139.     if( openlibs() )
  140.     {
  141.         loadprefs( "env:datatypes/sounddt41.prefs" );
  142.         
  143.         if( opengui() )
  144.         {
  145.             handleevents();
  146.         }
  147.  
  148.         closegui();
  149.     }
  150.     
  151.     closelibs();
  152.     
  153.     if( wbmsg )
  154.     {
  155.         Forbid();
  156.         ReplyMsg( wbmsg );
  157.     }
  158. }
  159.     
  160. /****************************************************************************/
  161.  
  162. BOOL openlibs( void )
  163. {
  164.     if(    ( DOSBase = OpenLibrary( "dos.library", 39L ) ) &&
  165.         ( GTLayoutBase = OpenLibrary( "gtlayout.library", 0L ) ) &&
  166.         ( GfxBase = OpenLibrary( "graphics.library", 39L ) ) &&
  167.         ( IntuitionBase = OpenLibrary( "intuition.library", 39L ) ) )
  168.     {
  169.         AHImp = CreateMsgPort();
  170.         if( ahir = (struct AHIRequest *) CreateIORequest( AHImp, sizeof( *ahir ) ) )
  171.         {
  172.             if( ! OpenDevice( "ahi.device", AHI_NO_UNIT, (struct IORequest *)ahir, 0L ) )
  173.             {
  174.                 AHIBase = (struct Library *) ahir->ahir_Std.io_Device;
  175.             }
  176.         }
  177.         
  178.         return TRUE;
  179.     }
  180.     
  181.     return FALSE;
  182. }
  183.  
  184. /****************************************************************************/
  185.  
  186. void closelibs( void )
  187. {
  188.     if( AHIBase )
  189.     {
  190.         CloseDevice( (struct IORequest *) ahir );
  191.     }
  192.     
  193.     DeleteIORequest( (struct IORequest *) ahir );
  194.     DeleteMsgPort( AHImp );
  195.     
  196.     CloseLibrary( DOSBase );
  197.     CloseLibrary( GTLayoutBase );
  198.     CloseLibrary( IntuitionBase );
  199.     CloseLibrary( GfxBase );
  200. }
  201.  
  202. /****************************************************************************/
  203.  
  204. #undef LT_New
  205.  
  206. void LT_New( struct LayoutHandle *lh, ULONG tags, ... )
  207. {
  208.     LT_NewA( lh, (struct TagItem *)&tags );
  209. }
  210.  
  211. /****************************************************************************/
  212.  
  213. ULONG IncHookFunc( REG(a2, ULONG val), REG(a1, LONG msg) )
  214. {
  215.     return val - ( msg == INCREMENTERMSG_Decrement ? 1024 : msg == INCREMENTERMSG_Increment ? -1024 : 0L );
  216. }
  217.  
  218. /****************************************************************************/
  219.  
  220. void RefreshHookFunc( REG(a1, struct RefreshMsg *msg) )
  221. {
  222.     struct RastPort    *rp = Wnd->RPort;
  223.     WORD            x = msg->Left, y = msg->Top,
  224.                     w = msg->Width, h = msg->Height;
  225.  
  226.     if( BgPen != -1L )
  227.     {
  228.         SetAPen( rp, BgPen );
  229.         RectFill( rp, x,y, x+w-1, y+h-1 );
  230.     }
  231.     
  232.     if( WfPen != -1L )
  233.     {    
  234.         LONG    i;
  235.         
  236.         SetAPen( rp, WfPen );
  237.         Move( rp, x+=4, y+=2 );
  238.         
  239.         for( i = 0; i < (w-8); i++ )
  240.         {
  241.             WORD    val = RangeRand( h-4 );
  242.             Draw( rp, x + i, y + val );
  243.         }
  244.     }
  245. }
  246.  
  247. /****************************************************************************/
  248.  
  249. ULONG GetAHIDefaultFreq( void )
  250. {
  251.     BPTR    fh;
  252.     ULONG    freq = AHI_DEFAULT_FREQ;
  253.     
  254.     if( fh = Open( "envarc:sys/ahi.prefs", MODE_OLDFILE ) )
  255.     {
  256.         ULONG    id;
  257.         
  258.         Seek( fh, 12L, OFFSET_BEGINNING );
  259.         
  260.         while( FRead( fh, &id, sizeof( id ), 1L ) == 1L )
  261.         {
  262.             if( id == ID_AHIU )
  263.             {
  264.                 struct AHIUnitPrefs    ahiup;
  265.                 
  266.                 if( FRead( fh, &id, sizeof( id ), 1L ) == 1L )
  267.                 {
  268.                     if( FRead( fh, &ahiup, sizeof( ahiup ), 1L ) == 1L )
  269.                     {
  270.                         if( ahiup.ahiup_Unit == AHI_NO_UNIT )
  271.                         {
  272.                             freq = ahiup.ahiup_Frequency;
  273.                             break;
  274.                         }
  275.                     }
  276.                 }
  277.             }
  278.             else
  279.             {
  280.                 if( FRead( fh, &id, sizeof( id ), 1L ) == 1L )
  281.                 {
  282.                     while( id-- ) FGetC( fh );
  283.                 }
  284.             }
  285.         }
  286.         
  287.         Close( fh );
  288.     }
  289.     
  290.     return( freq );
  291. }
  292.  
  293. /****************************************************************************/
  294.  
  295. BOOL opengui( void )
  296. {    
  297.     BOOL            okay = FALSE;
  298.     
  299.     if( screen = LockPubScreen( NULL ) )
  300.     {
  301.         static struct TagItem    menutags[] = {
  302.             LAMN_TitleText, (ULONG) "Project",
  303.                 LAMN_ItemText, (ULONG) "?\0About",
  304.                 LAMN_UserData, (ULONG) About,
  305.                 LAMN_ItemText, (ULONG) NM_BARLABEL,
  306.                 LAMN_ItemText, (ULONG) "Q\0Quit",
  307.                 LAMN_UserData, (ULONG) Quit,
  308.             LAMN_TitleText, (ULONG) "Edit",
  309.                 LAMN_ItemText, (ULONG) "D\0Reset To Defaults",
  310.                 LAMN_UserData, (ULONG) Defaults,
  311.                 LAMN_ItemText, (ULONG) "L\0Last Saved",
  312.                 LAMN_UserData, (ULONG) LastSaved,
  313.                 LAMN_ItemText, (ULONG) "R\0Restore",
  314.                 LAMN_UserData, (ULONG) Restore,
  315.             TAG_DONE };
  316.         
  317.         BgPen = ObtainPen( screen->ViewPort.ColorMap, -1, 
  318.             ( prefs.BgColor & 0x00ff0000 ) << 8L,
  319.             ( prefs.BgColor & 0x0000ff00 ) << 16L,
  320.             ( prefs.BgColor & 0x000000ff ) << 24L,
  321.             PEN_EXCLUSIVE );
  322.         
  323.         WfPen = ObtainPen( screen->ViewPort.ColorMap, -1, 
  324.             ( prefs.WfColor & 0x00ff0000 ) << 8L,
  325.             ( prefs.WfColor & 0x0000ff00 ) << 16L,
  326.             ( prefs.WfColor & 0x000000ff ) << 24L,
  327.             PEN_EXCLUSIVE );
  328.         
  329.         if( layouthandle = LT_CreateHandleTags( NULL, LAHN_PubScreen, (ULONG) screen, TAG_DONE ) )
  330.         {
  331.             LT_New( layouthandle,
  332.                 LA_Type, VERTICAL_KIND,
  333.                 TAG_DONE );
  334.             {
  335.                 STATIC STRPTR labels[] = { "General", "Appearance", NULL };
  336.                 
  337.                 LT_New( layouthandle,
  338.                     LA_Type, TAB_KIND,
  339.                     LATB_FullSize, TRUE,
  340.                     LATB_AutoPageID, ID_PAGEDGROUP,
  341.                     LATB_Labels, (ULONG) labels,
  342.                     TAG_DONE );
  343.                 
  344.                 LT_New( layouthandle,
  345.                     LA_Type, VERTICAL_KIND,
  346.                     LAGR_ActivePage, 0L,
  347.                     LA_ID, ID_PAGEDGROUP,
  348.                     TAG_DONE );
  349.                 {
  350.                     LT_New( layouthandle,
  351.                         LA_Type, VERTICAL_KIND,
  352.                         TAG_DONE );
  353.                     {
  354.                         LT_New( layouthandle,
  355.                             LA_Type, VERTICAL_KIND,
  356.                             LA_LabelText, (ULONG) "Misc",
  357.                             TAG_DONE );
  358.                         {
  359.                             STATIC struct Hook    IncHook = { NULL, NULL, (HOOKFUNC) IncHookFunc, NULL, NULL };
  360.                             
  361.                             LT_New( layouthandle,
  362.                                 LA_Type, HORIZONTAL_KIND,
  363.                                 TAG_DONE );
  364.                             {    
  365.                                 LT_New( layouthandle,
  366.                                     LA_Type, CHECKBOX_KIND,
  367.                                     LA_LabelText, (ULONG) "Compress",
  368.                                     LA_BOOL, (ULONG) &prefs.Compress,
  369.                                     TAG_DONE );
  370.                 
  371.                                 LT_New( layouthandle,
  372.                                     LA_Type, CHECKBOX_KIND,
  373.                                     LA_LabelText, (ULONG) "AIFF16",
  374.                                     LA_BOOL, (ULONG) &prefs.AIFF16,
  375.                                     TAG_DONE );
  376.                             }
  377.                             LT_EndGroup( layouthandle );
  378.                         
  379.                             LT_New( layouthandle,
  380.                                 LA_Type, INTEGER_KIND,
  381.                                 LA_LabelText, (ULONG) "Buffersize",
  382.                                 LA_ULONG, (ULONG) &prefs.BufferSize,
  383.                                 LAIN_Min, 1024L,
  384.                                 LAIN_Max, 131072L,
  385.                                 LAIN_UseIncrementers, TRUE,
  386.                                 LAIN_IncrementerHook, &IncHook,
  387.                                 GA_Disabled, (ULONG) prefs.AHI,
  388.                                 LA_ID, ID_BUFFERSIZE,
  389.                                 TAG_DONE );
  390.                                 
  391.                             LT_New( layouthandle,
  392.                                 LA_Type, SLIDER_KIND,
  393.                                 LA_LabelText, (ULONG) "Volume",
  394.                                 GTSL_LevelFormat, (ULONG) "%2ld",
  395.                                 LA_ULONG, (ULONG) &prefs.Volume,
  396.                                 GTSL_Min, 0,
  397.                                 GTSL_Max, 64,
  398.                                 TAG_DONE );
  399.                         }
  400.                         LT_EndGroup( layouthandle );
  401.                     
  402.                         if( AHIBase )
  403.                         {
  404.                             TEXT    driver[ 32 ];
  405.                             ULONG    audioid, freq = prefs.AHIMixFreq;
  406.                             
  407.                             if( freq == AHI_DEFAULT_FREQ )
  408.                             {
  409.                                 freq = GetAHIDefaultFreq();
  410.                             }
  411.                             
  412.                             LT_New( layouthandle,
  413.                                 LA_Type, HORIZONTAL_KIND,
  414.                                 LA_LabelText, (ULONG) "AHI settings",
  415.                                 TAG_DONE );
  416.                             {
  417.                                 LT_New( layouthandle,
  418.                                     LA_Type, VERTICAL_KIND,
  419.                                     TAG_DONE );
  420.                                 {
  421.                                     LT_New( layouthandle,
  422.                                         LA_Type, CHECKBOX_KIND,
  423.                                         LA_LabelText, (ULONG) "AHI",
  424.                                         LA_BOOL, (ULONG) &prefs.AHI,
  425.                                         LA_ID, ID_AHI,
  426.                                         TAG_DONE );
  427.                                         
  428.                                     LT_New( layouthandle,
  429.                                         LA_Type, CHECKBOX_KIND,
  430.                                         LA_LabelText, (ULONG) "Force mode",
  431.                                         LA_BOOL, (ULONG) &prefs.ForceAHIMode,
  432.                                         GA_Disabled, (ULONG) ! prefs.AHI,
  433.                                         LA_ID, ID_FORCEMODE,
  434.                                         TAG_DONE );
  435.                                 }
  436.                                 LT_EndGroup( layouthandle );
  437.                                 
  438.                                 if( AHI_GetAudioAttrs( prefs.AHIModeID, NULL, 
  439.                                     AHIDB_Name, (ULONG) &driver,
  440.                                     AHIDB_BufferLen, 32L,
  441.                                     AHIDB_AudioID, (ULONG) &audioid,
  442.                                     TAG_DONE ) )
  443.                                 {
  444.                                     sprintf( AHIReqLabel, "%s\nID 0x%08lx\n%ld hz", driver, audioid, freq );
  445.                                 }
  446.                                 else
  447.                                 {
  448.                                     sprintf( AHIReqLabel, "Driver N/A\nID 0x%08lx\n%ld hz", driver, prefs.AHIModeID, freq );
  449.                                 }    
  450.                                 
  451.                                 LT_New( layouthandle,
  452.                                     LA_Type, BUTTON_KIND,
  453.                                     LA_ID, ID_AHIREQ,
  454.                                     LA_LabelText, (ULONG) AHIReqLabel,
  455.                                     GA_Disabled, (ULONG) ! prefs.AHI,
  456.                                     TAG_DONE );
  457.                             }
  458.                             LT_EndGroup( layouthandle );
  459.                         }
  460.                     }
  461.                     LT_EndGroup( layouthandle );
  462.                     
  463.                     LT_New( layouthandle,
  464.                         LA_Type, VERTICAL_KIND,
  465.                         TAG_DONE );
  466.                     {    
  467.                         LT_New( layouthandle,
  468.                             LA_Type, VERTICAL_KIND,
  469.                             LAGR_SameSize, TRUE,
  470.                             TAG_DONE );
  471.                         {    
  472.                             STATIC struct Hook    RefreshHook = { NULL, NULL, (HOOKFUNC) RefreshHookFunc, NULL, NULL };
  473.                             
  474.                             LT_New( layouthandle,
  475.                                 LA_Type, FRAME_KIND,
  476.                                 LA_ID, ID_FRAME,
  477.                                 LAFR_RefreshHook, (ULONG) &RefreshHook,
  478.                                 LAFR_DrawBox, FALSE,
  479.                                 TAG_DONE );
  480.                             
  481.                             LT_New( layouthandle, 
  482.                                 LA_Type, HORIZONTAL_KIND,
  483.                     
  484.                                 TAG_DONE );
  485.                             {
  486.                                 LT_New( layouthandle,
  487.                                     LA_Type, VERTICAL_KIND,
  488.                                     LA_LabelText, (ULONG) "Background",
  489.                                     TAG_DONE );
  490.                                 {
  491.                                     LT_New( layouthandle, 
  492.                                         LA_Type, SLIDER_KIND,
  493.                                         LA_LabelText, (ULONG) "Red",
  494.                                         LA_UBYTE, (ULONG) &prefs.BgColor+1,
  495.                                         LA_Chars, 10L,
  496.                                         GTSL_LevelFormat, (ULONG) "%3ld",
  497.                                         GTSL_Min, 0,
  498.                                         GTSL_Max, 255,
  499.                                         GA_Immediate, TRUE,
  500.                                         LA_ID, ID_BGCOLORSLIDER,
  501.                                         TAG_DONE );
  502.                                         
  503.                                     LT_New( layouthandle, 
  504.                                         LA_Type, SLIDER_KIND,
  505.                                         LA_LabelText, (ULONG) "Green",
  506.                                         GTSL_LevelFormat, (ULONG) "%3ld",
  507.                                         LA_UBYTE, (ULONG) &prefs.BgColor+2,
  508.                                         GTSL_Min, 0,
  509.                                         GTSL_Max, 255,
  510.                                         GA_Immediate, TRUE,
  511.                                         LA_ID, ID_BGCOLORSLIDER,
  512.                                         TAG_DONE );
  513.                 
  514.                                     LT_New( layouthandle, 
  515.                                         LA_Type, SLIDER_KIND,
  516.                                         LA_LabelText, (ULONG) "Blue",
  517.                                         GTSL_LevelFormat, (ULONG) "%3ld",
  518.                                         LA_UBYTE, (ULONG) &prefs.BgColor+3,
  519.                                         GTSL_Min, 0,
  520.                                         GTSL_Max, 255,
  521.                                         GA_Immediate, TRUE,
  522.                                         LA_ID, ID_BGCOLORSLIDER,
  523.                                         TAG_DONE );
  524.                                 }
  525.                                 LT_EndGroup( layouthandle );
  526.                                 
  527.                                 LT_New( layouthandle,
  528.                                     LA_Type, VERTICAL_KIND,
  529.                                     LA_LabelText, (ULONG) "Waveform",                        
  530.                                     TAG_DONE );
  531.                                 {                            
  532.                                     LT_New( layouthandle, 
  533.                                         LA_Type, SLIDER_KIND,
  534.                                         LA_LabelText, (ULONG) "Red",
  535.                                         LA_Chars, 10L,
  536.                                         GTSL_LevelFormat, (ULONG) "%3ld",
  537.                                         LA_UBYTE, (ULONG) &prefs.WfColor+1,
  538.                                         GTSL_Min, 0,
  539.                                         GTSL_Max, 255,
  540.                                         LA_ID, ID_WFCOLORSLIDER,
  541.                                         GA_Immediate, TRUE,
  542.                                         TAG_DONE );
  543.                                         
  544.                                     LT_New( layouthandle, 
  545.                                         LA_Type, SLIDER_KIND,
  546.                                         LA_LabelText, (ULONG) "Green",
  547.                                         LA_UBYTE, (ULONG) &prefs.WfColor+2,
  548.                                         GTSL_LevelFormat, (ULONG) "%3ld",
  549.                                         GTSL_Min, 0,
  550.                                         GTSL_Max, 255,
  551.                                         LA_ID, ID_WFCOLORSLIDER,
  552.                                         GA_Immediate, TRUE,
  553.                                         TAG_DONE );
  554.                 
  555.                                     LT_New( layouthandle, 
  556.                                         LA_Type, SLIDER_KIND,
  557.                                         LA_LabelText, (ULONG) "Blue",
  558.                                         LA_UBYTE, (ULONG) &prefs.WfColor+3,
  559.                                         GTSL_LevelFormat, (ULONG) "%3ld",
  560.                                         GTSL_Min, 0,
  561.                                         GTSL_Max, 255,
  562.                                         LA_ID, ID_WFCOLORSLIDER,
  563.                                         GA_Immediate, TRUE,
  564.                                         TAG_DONE );
  565.                                 }
  566.                                 LT_EndGroup( layouthandle );
  567.                             }
  568.                             LT_EndGroup( layouthandle );
  569.                         }
  570.                         LT_EndGroup( layouthandle );
  571.                             
  572.                         LT_New( layouthandle,
  573.                             LA_Type, HORIZONTAL_KIND,
  574.                             LA_LabelText, (ULONG) "Default Size",
  575.                             LAGR_SameSize, TRUE,
  576.                             LAGR_Spread, TRUE,
  577.                             TAG_DONE );
  578.                         {
  579.                             LT_New( layouthandle,
  580.                                 LA_Type, SLIDER_KIND,
  581.                                 LA_LabelText, (ULONG) "Width",
  582.                                 LA_UWORD, (ULONG) &prefs.Width,
  583.                                 LA_Chars, 10L,
  584.                                 GTSL_LevelFormat, (ULONG) "%4ld",
  585.                                 GTSL_Min, 16,
  586.                                 GTSL_Max, 1024,
  587.                                 TAG_DONE );
  588.                         
  589.                             LT_New( layouthandle,
  590.                                 LA_Type, SLIDER_KIND,
  591.                                 LA_LabelText, (ULONG) "Height",
  592.                                 LA_UWORD, (ULONG) &prefs.Height,
  593.                                 GTSL_LevelFormat, (ULONG) "%4ld",
  594.                                 GTSL_Min, 16,
  595.                                 GTSL_Max, 1024,
  596.                                 TAG_DONE );
  597.                         }
  598.                         LT_EndGroup( layouthandle );
  599.                         
  600.                         LT_New( layouthandle,
  601.                             LA_Type, HORIZONTAL_KIND,
  602.                             LA_LabelText, (ULONG) "Tapedeck",
  603.                             LAGR_Spread, TRUE,
  604.                             TAG_DONE );
  605.                         {
  606.                             LT_New( layouthandle,
  607.                                 LA_Type, CHECKBOX_KIND,
  608.                                 LA_LabelText, (ULONG) "ControlPanel",
  609.                                 LA_BOOL, (ULONG) &prefs.ControlPanel,
  610.                                 LA_ID, ID_CONTROLPANEL,
  611.                                 TAG_DONE );
  612.         
  613.                             LT_New( layouthandle,
  614.                                 LA_Type, CHECKBOX_KIND,
  615.                                 LA_LabelText, (ULONG) "NoGTSlider",
  616.                                 LA_BOOL, (ULONG) &prefs.NoGTSlider,
  617.                                 LA_ID, ID_NOGTSLIDER,
  618.                                 GA_Disabled, (ULONG) ! prefs.ControlPanel,
  619.                                 TAG_DONE );
  620.                         }
  621.                         LT_EndGroup( layouthandle );
  622.                     }
  623.                     LT_EndGroup( layouthandle );
  624.                 }        
  625.                 LT_EndGroup( layouthandle );
  626.                         
  627.                 LT_New( layouthandle,
  628.                     LA_Type, XBAR_KIND,
  629.                     LAXB_FullSize, TRUE,
  630.                     TAG_DONE );
  631.                 
  632.                 LT_New( layouthandle,
  633.                     LA_Type, HORIZONTAL_KIND,
  634.                     LAGR_Spread, TRUE,
  635.                     LAGR_SameSize, TRUE,
  636.                     TAG_DONE );
  637.                 {
  638.                     LT_New( layouthandle,
  639.                         LA_Type, BUTTON_KIND,
  640.                         LA_LabelText, (ULONG) "Save",
  641.                         LA_ID, ID_SAVE,
  642.                         LABT_ReturnKey, TRUE,
  643.                         TAG_DONE );
  644.                     
  645.                     LT_New( layouthandle,
  646.                         LA_Type, BUTTON_KIND,
  647.                         LA_LabelText, (ULONG) "Use",
  648.                         LA_ID, ID_USE,
  649.                         TAG_DONE );
  650.                         
  651.                     LT_New( layouthandle,
  652.                         LA_Type, BUTTON_KIND,
  653.                         LA_LabelText, (ULONG) "Cancel",
  654.                         LA_ID, ID_CANCEL,
  655.                         LABT_EscKey, TRUE,
  656.                         TAG_DONE );
  657.                 }
  658.                 LT_EndGroup( layouthandle );
  659.             }
  660.             LT_EndGroup( layouthandle );
  661.                 
  662.             if( Wnd = LT_Build( layouthandle,
  663.                 LAWN_Title, (ULONG) "SoundDT v41 prefs",
  664.                 LAWN_IDCMP, IDCMP_CLOSEWINDOW,
  665.                 LAWN_SmartZoom, TRUE,
  666.                 LAWN_Show, TRUE,
  667.                 LAWN_MenuTags, (ULONG) menutags,
  668.                 WA_Flags, WFLG_ACTIVATE | WFLG_CLOSEGADGET | 
  669.                         WFLG_DEPTHGADGET | WFLG_DRAGBAR,
  670.                 WA_ScreenTitle, (ULONG) &VerStr[6],
  671.                 TAG_DONE ) )
  672.             {
  673.                 okay = TRUE;
  674.             }
  675.         }
  676.     }
  677.  
  678.     if( ! okay )
  679.     {
  680.         closegui();
  681.     }
  682.  
  683.     return okay;
  684. }
  685.         
  686. /****************************************************************************/
  687.  
  688. void closegui( void )
  689. {
  690.     ReleasePen( screen->ViewPort.ColorMap, BgPen );
  691.     ReleasePen( screen->ViewPort.ColorMap, WfPen );
  692.     LT_DeleteHandle( layouthandle );
  693.     UnlockPubScreen( NULL, screen );
  694.     layouthandle = NULL;
  695. }
  696.  
  697. /****************************************************************************/
  698.  
  699. void handleevents( void )
  700. {
  701.     struct IntuiMessage    *Message;
  702.     ULONG                MsgQualifier,
  703.                         MsgClass;
  704.     UWORD                        MsgCode;
  705.     struct Gadget               *MsgGadget;
  706.     BOOL                quit = FALSE;
  707.     
  708.     do 
  709.     {
  710.         WaitPort( Wnd->UserPort );
  711.         
  712.         while( Message = LT_GetIMsg( layouthandle ) )
  713.         {
  714.             MsgClass    = Message->Class;
  715.             MsgCode    = Message->Code;
  716.             MsgQualifier    = Message->Qualifier;
  717.             MsgGadget    = Message->IAddress;
  718.         
  719.             LT_ReplyIMsg( Message );
  720.     
  721.             switch(MsgClass)
  722.             {
  723.                 case IDCMP_CLOSEWINDOW:
  724.                     quit = TRUE;
  725.                 break;
  726.                 
  727.                 case IDCMP_GADGETUP:
  728.                     switch( MsgGadget->GadgetID )
  729.                     {
  730.                         case ID_AHIREQ:
  731.                             if( AHIModeRequest() )
  732.                             {
  733.                                 closegui();
  734.                                 quit = ! opengui();
  735.                             }
  736.                         break;
  737.                         
  738.                         case ID_SAVE:
  739.                             saveprefs( "envarc:datatypes/sounddt41.prefs" );
  740.                         case ID_USE:
  741.                             saveprefs( "env:datatypes/sounddt41.prefs" );
  742.                         case ID_CANCEL:
  743.                             quit = TRUE;
  744.                         break;
  745.                         
  746.                         case ID_AHI:
  747.                             LT_SetAttributes( layouthandle, ID_AHIREQ, GA_Disabled, (ULONG) ! prefs.AHI, TAG_DONE );
  748.                             LT_SetAttributes( layouthandle, ID_FORCEMODE, GA_Disabled, (ULONG) ! prefs.AHI, TAG_DONE );
  749.                             LT_SetAttributes( layouthandle, ID_BUFFERSIZE, GA_Disabled, (ULONG) prefs.AHI, TAG_DONE );
  750.                         break;
  751.                         
  752.                         case ID_CONTROLPANEL:
  753.                             LT_SetAttributes( layouthandle, ID_NOGTSLIDER, GA_Disabled, (ULONG) ! prefs.ControlPanel, TAG_DONE );
  754.                         break;
  755.                     }
  756.                 break;
  757.                 
  758.                 case IDCMP_MOUSEMOVE:
  759.                     if( ! MsgGadget ) break;
  760.                     
  761.                     switch( MsgGadget->GadgetID )
  762.                     {
  763.                         case ID_BGCOLORSLIDER:
  764.                             if( BgPen != -1L )
  765.                             {
  766.                                 SetRGB32( &screen->ViewPort, BgPen,
  767.                                     ( prefs.BgColor & 0x00ff0000 ) << 8L,
  768.                                     ( prefs.BgColor & 0x0000ff00 ) << 16L,
  769.                                     ( prefs.BgColor & 0x000000ff ) << 24L );
  770.                             }
  771.                         break;
  772.                         
  773.                         case ID_WFCOLORSLIDER:
  774.                             if( WfPen != -1L )
  775.                             {
  776.                                 SetRGB32( &screen->ViewPort, WfPen,
  777.                                     ( prefs.WfColor & 0x00ff0000 ) << 8L,
  778.                                     ( prefs.WfColor & 0x0000ff00 ) << 16L,
  779.                                     ( prefs.WfColor & 0x000000ff ) << 24L );
  780.                             }
  781.                         break;
  782.                     }
  783.                 break;
  784.                 
  785.                 case IDCMP_MENUPICK:
  786.                 {
  787.                     struct MenuItem *item = ItemAddress( layouthandle->Menu, MsgCode );
  788.                     
  789.                     if( item )
  790.                     {
  791.                         ((void (*)())LAMN_Item_UserData(item))();
  792.                         /*- return if hide -*/
  793.                         if( ! layouthandle ) return;
  794.                                }
  795.                            }
  796.                 break;
  797.             }
  798.         }        
  799.     }
  800.     while( ! quit );
  801. }
  802.  
  803. /****************************************************************************/
  804.  
  805. void errorreport( STRPTR header, LONG error )
  806. {
  807.     TEXT            buf[ FAULT_MAX + 128 ];
  808.     struct EasyStruct    es = { sizeof(struct EasyStruct), NULL, "SoundDT v41 prefs", buf, "Okay" };
  809.                 
  810.     if( Fault( error, header, buf, sizeof( buf ) ) )
  811.     {
  812.         EasyRequestArgs( NULL, &es, NULL, NULL );
  813.     }
  814. }
  815.  
  816. /****************************************************************************/
  817.  
  818. void init_prefs( void )
  819. {
  820.     prefs.AHI        = FALSE;
  821.     prefs.AHIModeID    = AHI_DEFAULT_ID;
  822.     prefs.ForceAHIMode = FALSE;
  823.     prefs.AHIMixFreq    = AHI_DEFAULT_FREQ;
  824.     prefs.Compress    = FALSE;
  825.     prefs.AIFF16        = FALSE;
  826.     prefs.Width        = 160;
  827.     prefs.Height        = 100;
  828.     prefs.BgColor        = 0L;
  829.     prefs.WfColor    = ( 35 << 16 ) | ( 204 << 8 ) | ( 23 );
  830.     prefs.BufferSize    = 65536L;
  831.     prefs.Volume        = 64L;
  832.     prefs.ControlPanel    = FALSE;
  833.     prefs.NoGTSlider    = FALSE;
  834. }
  835.  
  836. /****************************************************************************/
  837.  
  838. void loadprefs( STRPTR path )
  839. {
  840.     TEXT            buf[256];
  841.     LONG            len;
  842.  
  843.     init_prefs();
  844.  
  845.     if( ( len = GetVar( path, buf, sizeof( buf )-1, GVF_GLOBAL_ONLY ) ) > 0 )
  846.     {
  847.         struct RDArgs    *rdargs;
  848.         
  849.         if( rdargs = AllocDosObject( DOS_RDARGS, NULL ) )
  850.         {
  851.             struct RDArgs    *freeargs;
  852.             struct {
  853.                 LONG    *volume;
  854.                 LONG    *buffersize;
  855.                 LONG    ahi;
  856.                 STRPTR    ahimodeid;
  857.                 LONG    forceahimode;
  858.                 LONG    *mixfreq;
  859.                 LONG    aiff;
  860.                 LONG    compress;
  861.                 LONG    *width, *height;
  862.                 STRPTR    bg, wf;
  863.                 LONG    cp;
  864.                 LONG    nogtsl;            
  865.             } args = { };
  866.         
  867.             /* prepare rdargs */
  868.             buf[len++] = '\n';
  869.             rdargs->RDA_Source.CS_Buffer = buf;
  870.             rdargs->RDA_Source.CS_Length = len;
  871.             rdargs->RDA_Flags = RDAF_NOPROMPT;
  872.         
  873.             if( freeargs = ReadArgs( TEMPLATE, (LONG *)&args, rdargs ) )
  874.             {
  875.                 if( args.ahi )
  876.                 {
  877.                     prefs.AHI = TRUE;
  878.                 }
  879.                 
  880.                 if( args.ahimodeid )
  881.                 {
  882.                     prefs.AHIModeID = Hex2Long( args.ahimodeid );
  883.                 }
  884.                 
  885.                 if( args.forceahimode )
  886.                 {
  887.                     prefs.ForceAHIMode = TRUE;
  888.                 }
  889.                 
  890.                 if( args.mixfreq )
  891.                 {
  892.                     prefs.AHIMixFreq = *args.mixfreq;
  893.                 }
  894.                 
  895.                 if( args.aiff )
  896.                 {
  897.                     prefs.AIFF16 = TRUE;
  898.                 }
  899.                 
  900.                 if( args.compress )
  901.                 {
  902.                     prefs.Compress = TRUE;
  903.                 }
  904.                 
  905.                 if( args.width )
  906.                 {
  907.                     prefs.Width = *args.width;
  908.                 }
  909.                 
  910.                 if( args.height )
  911.                 {
  912.                     prefs.Height = *args.height;
  913.                 }
  914.                 
  915.                 if( args.wf )
  916.                 {
  917.                     prefs.WfColor = Hex2Long( args.wf );
  918.                 }
  919.                 
  920.                 if( args.bg )
  921.                 {
  922.                     prefs.BgColor = Hex2Long( args.bg );
  923.                 }
  924.                 
  925.                 if( args.buffersize )
  926.                 {
  927.                     LONG    bufsize = *args.buffersize;
  928.                     
  929.                     if( bufsize > 1023 && bufsize < 131073 )
  930.                     {
  931.                         prefs.BufferSize = bufsize;
  932.                     }
  933.                 }
  934.                 
  935.                 if( args.cp )
  936.                 {
  937.                     prefs.ControlPanel = TRUE;
  938.                 }
  939.                 
  940.                 if( args.volume )
  941.                 {
  942.                     prefs.Volume = *args.volume;
  943.                 }
  944.                 
  945.                 if( args.nogtsl )
  946.                 {
  947.                     prefs.NoGTSlider = TRUE;
  948.                 }
  949.                 
  950.                 FreeArgs( freeargs );
  951.             }
  952.             else
  953.             {
  954.                 errorreport( path, IoErr() );
  955.             }
  956.  
  957.             FreeDosObject( DOS_RDARGS, rdargs );
  958.         }
  959.         else
  960.         {
  961.             errorreport( path, ERROR_NO_FREE_STORE );
  962.         }
  963.     }
  964. }
  965.  
  966. /****************************************************************************/
  967.  
  968. void saveprefs( STRPTR path )
  969. {
  970.     BPTR    fh;
  971.     
  972.     if( fh = Open( path, MODE_NEWFILE ) )
  973.     {
  974.         if( prefs.AHI )
  975.         {
  976.             FPuts( fh, "AHI " );
  977.         }
  978.         
  979.         if( prefs.AHIModeID != AHI_DEFAULT_ID )
  980.         {
  981.             FPrintf( fh, "AHIMODEID=0x%08lx ", prefs.AHIModeID );
  982.         }
  983.         
  984.         if( prefs.AHIMixFreq != AHI_DEFAULT_FREQ )
  985.         {
  986.             FPrintf( fh, "AHIMIXFREQ=%ld ", prefs.AHIMixFreq );
  987.         }
  988.         
  989.         if( prefs.ForceAHIMode )
  990.         {
  991.             FPrintf( fh, "FORCEAHIMODE " );
  992.         }
  993.         
  994.         if( prefs.Volume != 64L )
  995.         {
  996.             FPrintf( fh, "VOLUME=%ld ", prefs.Volume );
  997.         }
  998.         
  999.         if( prefs.BufferSize != 65536 )
  1000.         {
  1001.             FPrintf( fh, "BUFFERSIZE=%ld ", prefs.BufferSize );
  1002.         }
  1003.         
  1004.         if( prefs.AIFF16 )
  1005.         {
  1006.             FPrintf( fh, "AIFF16 " );
  1007.         }
  1008.         
  1009.         if( prefs.Compress )
  1010.         {
  1011.             FPrintf( fh, "COMPRESS " );
  1012.         }
  1013.         
  1014.         if( prefs.ControlPanel )
  1015.         {
  1016.             FPrintf( fh, "CONTROLPANEL=YES " );
  1017.         }
  1018.         
  1019.         if( prefs.NoGTSlider )
  1020.         {
  1021.             FPrintf( fh, "NOGTSLIDER " );
  1022.         }
  1023.         
  1024.         if( prefs.Width != 160 )
  1025.         {
  1026.             FPrintf( fh, "WIDTH=%ld ", prefs.Width );
  1027.         }
  1028.         
  1029.         if( prefs.Height != 100 )
  1030.         {
  1031.             FPrintf( fh, "HEIGHT=%ld ", prefs.Height );
  1032.         }
  1033.         
  1034.         if( prefs.BgColor != 0 )
  1035.         {
  1036.             FPrintf( fh, "BG=0x%08lx ", prefs.BgColor );
  1037.         }
  1038.         
  1039.         if( prefs.WfColor != ( ( 35 << 16 ) | ( 204 << 8 ) | ( 23 ) ) )
  1040.         {
  1041.             FPrintf( fh, "WF=0x%08lx ", prefs.WfColor );
  1042.         }
  1043.         
  1044.         Close( fh );
  1045.     }
  1046.     else
  1047.     {
  1048.         errorreport( path, IoErr() );
  1049.     }
  1050. }
  1051.  
  1052. /****************************************************************************/
  1053.  
  1054. LONG Hex2Long( STRPTR s )
  1055. {
  1056.     LONG    a = 0L;
  1057.     BYTE    c;
  1058.     
  1059.     if( s && ( c = *s++ ) && ( c == '$' || (c == '0' && *s++ == 'x' ) ) ) 
  1060.     {
  1061.         while( c = *s++ )
  1062.         {
  1063.             if ( c > '9' )
  1064.             {
  1065.                 c &= 0x5f;
  1066.             }
  1067.             
  1068.             if( ( c -= '0' ) < 0 || ( c > 9 && ( c -= 7 ) >15 ) )
  1069.             {
  1070.                 break;
  1071.             }
  1072.             
  1073.             a = a << 4 | c;
  1074.         }
  1075.     }
  1076.     
  1077.     return a;
  1078. }
  1079.  
  1080. /****************************************************************************/
  1081.  
  1082. void sprintf( REG(a3,STRPTR PutChData), REG(a0, STRPTR FormatStr), STRPTR data, ... )
  1083. {
  1084.     struct Library    *SysBase = (*(struct Library **)4L);
  1085.     
  1086.     RawDoFmt(FormatStr, &data, (void (*)())"\x16\xc0\x4e\x75", PutChData);
  1087. }
  1088.  
  1089. /****************************************************************************/
  1090.  
  1091. BOOL AHIModeRequest( void )
  1092. {
  1093.     struct AHIAudioModeRequester    *req;
  1094.     BOOL                        ret = FALSE;
  1095.     
  1096.     if( req = AHI_AllocAudioRequest( NULL ) )
  1097.     {
  1098.         ULONG    audioid = prefs.AHIModeID,
  1099.                 freq = prefs.AHIMixFreq;
  1100.         
  1101.         if( audioid == AHI_DEFAULT_ID )
  1102.         {
  1103.             AHI_GetAudioAttrs( audioid, NULL, 
  1104.                 AHIDB_AudioID, (ULONG) &audioid,
  1105.                 TAG_DONE );
  1106.         }
  1107.         
  1108.         if( freq == AHI_DEFAULT_FREQ )
  1109.         {
  1110.             freq = GetAHIDefaultFreq();
  1111.         }
  1112.         
  1113.         if( ret = AHI_AudioRequest( req,
  1114.             AHIR_Window, (ULONG)Wnd,
  1115.             AHIR_SleepWindow, TRUE,
  1116.             AHIR_InitialAudioID, audioid,
  1117.             AHIR_InitialMixFreq, freq,
  1118.             AHIR_DoMixFreq, TRUE,
  1119.             TAG_DONE ) )
  1120.         {
  1121.             prefs.AHIModeID = req->ahiam_AudioID;
  1122.             prefs.AHIMixFreq = req->ahiam_MixFreq;
  1123.         }
  1124.         
  1125.         AHI_FreeAudioRequest( req );
  1126.     }
  1127.     
  1128.     return ret;
  1129. }
  1130.  
  1131. /****************************************************************************/
  1132.  
  1133. void Quit( void )
  1134. {
  1135.     closegui();
  1136. }
  1137.  
  1138. /****************************************************************************/
  1139.  
  1140. void About( void )
  1141. {
  1142.     TEXT            buf[ 256 ];
  1143.     struct EasyStruct    es = {
  1144.         sizeof(struct EasyStruct),
  1145.         NULL, 
  1146.         "SoundDT v41 prefs", 
  1147.         buf,
  1148.         "Okay" };
  1149.         
  1150.     sprintf( buf, "%.31s\n%s\n\nstephan.rupprecht@gmx.de", &VerStr[6], &VerStr[38] );
  1151.     
  1152.     EasyRequestArgs( NULL, &es, NULL, NULL );
  1153. }
  1154.  
  1155. /****************************************************************************/
  1156.  
  1157. void Defaults( void )
  1158. {
  1159.     closegui();
  1160.     init_prefs();
  1161.     opengui();
  1162. }
  1163.  
  1164. /****************************************************************************/
  1165.  
  1166. void LastSaved( void )
  1167. {
  1168.     closegui();
  1169.     loadprefs( "envarc:datatypes/sounddt41.prefs" );
  1170.     opengui();
  1171. }
  1172.  
  1173. /****************************************************************************/
  1174.  
  1175. void Restore( void )
  1176. {
  1177.     closegui();
  1178.     loadprefs( "env:datatypes/sounddt41.prefs" );
  1179.     opengui();
  1180. }
  1181.  
  1182. /****************************************************************************/
  1183.